home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / pythonloader.py < prev    next >
Text File  |  2008-10-15  |  7KB  |  160 lines

  1. #*************************************************************************
  2. #
  3. #   OpenOffice.org - a multi-platform office productivity suite
  4. #
  5. #   $RCSfile: pythonloader.py,v $
  6. #
  7. #   $Revision: 1.5.8.1 $
  8. #
  9. #   last change: $Author: ihi $ $Date: 2008/05/20 14:04:47 $
  10. #
  11. #   The Contents of this file are made available subject to
  12. #   the terms of GNU Lesser General Public License Version 2.1.
  13. #
  14. #
  15. #     GNU Lesser General Public License Version 2.1
  16. #     =============================================
  17. #     Copyright 2005 by Sun Microsystems, Inc.
  18. #     901 San Antonio Road, Palo Alto, CA 94303, USA
  19. #
  20. #     This library is free software; you can redistribute it and/or
  21. #     modify it under the terms of the GNU Lesser General Public
  22. #     License version 2.1, as published by the Free Software Foundation.
  23. #
  24. #     This library is distributed in the hope that it will be useful,
  25. #     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. #     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  27. #     Lesser General Public License for more details.
  28. #
  29. #     You should have received a copy of the GNU Lesser General Public
  30. #     License along with this library; if not, write to the Free Software
  31. #     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  32. #     MA  02111-1307  USA
  33. #
  34. #*************************************************************************
  35. import uno
  36. import unohelper
  37. import sys
  38. import imp
  39. import os
  40. from com.sun.star.uno import Exception,RuntimeException
  41. from com.sun.star.loader import XImplementationLoader
  42. from com.sun.star.lang import XServiceInfo
  43.  
  44. MODULE_PROTOCOL = "vnd.openoffice.pymodule:"
  45. DEBUG = 1
  46.  
  47. g_supportedServices  = "com.sun.star.loader.Python",      # referenced by the native C++ loader !
  48. g_implementationName = "org.openoffice.comp.pyuno.Loader" # referenced by the native C++ loader !
  49.  
  50. def splitUrl( url ):
  51.       nColon = url.find( ":" )
  52.       if -1 == nColon:
  53.             raise RuntimeException( "PythonLoader: No protocol in url " + url, None )
  54.       return url[0:nColon], url[nColon+1:len(url)]
  55.  
  56. g_loadedComponents = {}
  57. def checkForPythonPathBesideComponent( url ):
  58.       path = unohelper.fileUrlToSystemPath( url+"/pythonpath.zip" );
  59.       if DEBUG == 1:
  60.             print "checking for existence of " + encfile( path )
  61.       if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
  62.             if DEBUG == 1:
  63.                   print "adding " + encfile( path ) + " to sys.path"
  64.             sys.path.append( path )
  65.  
  66.       path = unohelper.fileUrlToSystemPath( url+"/pythonpath" );
  67.       if 1 == os.access( encfile( path ), os.F_OK) and not path in sys.path:
  68.             if DEBUG == 1:
  69.                   print "adding " + encfile( path ) + " to sys.path"
  70.             sys.path.append( path )
  71.  
  72. def encfile(uni):
  73.     return uni.encode( sys.getfilesystemencoding())
  74.  
  75. class Loader( XImplementationLoader, XServiceInfo, unohelper.Base ):
  76.       def __init__(self, ctx ):
  77.       if DEBUG:
  78.          print "pythonloader.Loader ctor" 
  79.       self.ctx = ctx
  80.  
  81.       def getModuleFromUrl( self, url ):
  82.           if DEBUG:
  83.                 print "pythonloader: interpreting url " +url
  84.           protocol, dependent = splitUrl( url )
  85.           if "vnd.sun.star.expand" == protocol:
  86.                 exp = self.ctx.getValueByName( "/singletons/com.sun.star.util.theMacroExpander" )
  87.                 url = exp.expandMacros(dependent)
  88.                 protocol,dependent = splitUrl( url )
  89.  
  90.           if DEBUG:
  91.                 print "pythonloader: after expansion " +protocol +":" + dependent
  92.                 
  93.           try:
  94.                 if "file" == protocol:
  95.                       # remove \..\ sequence, which may be useful e.g. in the build env
  96.                       url = unohelper.absolutize( url, url )
  97.  
  98.                       # did we load the module already ?
  99.                       mod = g_loadedComponents.get( url )
  100.                       if not mod:
  101.                             mod = imp.new_module("uno_component")
  102.  
  103.                             # check for pythonpath.zip beside .py files
  104.                             checkForPythonPathBesideComponent( url[0:url.rfind('/')] )
  105.                             
  106.                             # read the file
  107.                             filename = unohelper.fileUrlToSystemPath( url )
  108.                             fileHandle = file( filename )
  109.                             src = fileHandle.read().replace("\r","")
  110.                             if not src.endswith( "\n" ):
  111.                                   src = src + "\n"
  112.  
  113.                             # compile and execute the module
  114.                             codeobject = compile( src, encfile(filename), "exec" )
  115.                             exec codeobject in mod.__dict__
  116.                             mod.__file__ = encfile(filename)
  117.                             g_loadedComponents[url] = mod
  118.                       return mod
  119.                 elif "vnd.openoffice.pymodule" == protocol:
  120.                       return  __import__( dependent )
  121.                 else:
  122.                       raise RuntimeException( "PythonLoader: Unknown protocol " +
  123.                                               protocol + " in url " +url, self )
  124.           except ImportError, e:
  125.                 raise RuntimeException( "Couldn't load "+url+ " for reason "+str(e), None)
  126.           return None
  127.        
  128.       def activate( self, implementationName, dummy, locationUrl, regKey ):
  129.       if DEBUG:
  130.          print "pythonloader.Loader.activate"
  131.  
  132.       mod = self.getModuleFromUrl( locationUrl )
  133.           implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
  134.           if implHelper == None:
  135.         return mod.getComponentFactory( implementationName, self.ctx.ServiceManager, regKey )
  136.           else:
  137.         return implHelper.getComponentFactory( implementationName,regKey,self.ctx.ServiceManager)
  138.          
  139.       def writeRegistryInfo( self, regKey, dummy, locationUrl ):
  140.       if DEBUG:
  141.          print "pythonloader.Loader.writeRegistryInfo"
  142.              
  143.       mod = self.getModuleFromUrl( locationUrl )
  144.           implHelper = mod.__dict__.get( "g_ImplementationHelper" , None )
  145.           if implHelper == None:
  146.             return mod.writeRegistryInfo( self.ctx.ServiceManager, regKey )
  147.           else:
  148.             return implHelper.writeRegistryInfo( regKey, self.ctx.ServiceManager )
  149.  
  150.       def getImplementationName( self ):
  151.       return g_implementationName
  152.  
  153.       def supportsService( self, ServiceName ):
  154.       return ServiceName in self.serviceNames
  155.  
  156.       def getSupportedServiceNames( self ):
  157.       return g_supportedServices
  158.  
  159.  
  160.